package main

import (
	"fgo/advance/db/gorm2/models"
	"fmt"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

func main() {
	db := models.NewDb()
	// 查询 user
	var user models.User
	db.Debug().First(&user)
	fmt.Println(user.Languages) // 没有自动加载 !!!
	var languages models.Language
	// 查找关联
	// 根据 user 主键,查询  Languages
	db.Debug().Model(&user).Association("Languages").Find(&languages)
	fmt.Println("=======> ")
	fmt.Println(user)
	fmt.Println(languages)

	fmt.Println("=======> 查找关联")
	// 预加载
	db.Debug().Preload("Languages").Preload("CreditCard").First(&user)
	fmt.Println(user.Languages) // 预加载
	fmt.Println(user.CreditCard) // 预加载
	fmt.Println("=======> 预加载")

	// 预加载全部
	db.Debug().Preload(clause.Associations).Find(&user)
	fmt.Println(user)
	fmt.Println("=======> 预加载全部")


	// 预加载 - 待条件
	db.Debug().Where("name = ?", "ZoneName").Preload("BillingAddress","address1 = ?","add11").First(&user)
	fmt.Println(user.BillingAddress) // 预加载
	fmt.Println("=======> 预加载 - 待条件")
	// SELECT * FROM users WHERE name = 'ZoneName';
	// SELECT * FROM address WHERE user_id IN (1,2) AND address1 = "add11";

	// 自定义预加载 SQL
	var users []models.User
	db.Debug().Preload("BillingAddress", func(db *gorm.DB) *gorm.DB {
		return db.Order("address.address1 DESC")
	}).Find(&users)
	fmt.Println(users)
	// SELECT * FROM users;
	// SELECT * FROM address WHERE user_id IN (1,2,3,4) order by address.address1 DESC;
	fmt.Println("=======> 自定义预加载")

	// 嵌套预加载 TODO
	// db.Preload("Orders.OrderItems.Product").Preload("CreditCard").Find(&users)

	fmt.Println("=======>")

	// 添加关联
	/*db.Model(&user).Association("Languages").Append([]models.Language{
		{Name: "EN", Code: "100002"},
	})*/
	// 替换关联
	/*db.Model(&user).Association("Languages").Replace([]models.Language{
		{Name: "EN", Code: "100002"},
	})*/
	// 删除关联
	// 如果存在，则删除源模型与参数之间的关系，只会删除引用，不会从数据库中删除这些对象。
	// 为删除成功 ???
	/*db.Model(&user).Association("Languages").Delete([]models.Language{
		{Name: "EN", Code: "100002"},
	})*/
	// 清空关联
	// db.Model(&user).Association("Languages").Clear()
	// 关联计数
	/*relCount := db.Model(&user).Association("Languages").Count()
	fmt.Printf("关联数: %d\n",relCount)*/
	// 批量处理数据
	// TODO

}
